package br.com.divulgaqui.persistence.daoimpl;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import br.com.divulgaqui.entity.Pessoa;
import br.com.divulgaqui.persistence.dao.JPAGenericDAO;
import br.com.divulgaqui.persistence.dao.PessoaDAO;

public class PessoaDAOImpl extends JPAGenericDAO<Pessoa> implements PessoaDAO {

	public PessoaDAOImpl(EntityManager entityManager) {
		super(entityManager);
	}
	

	@Override
	public List<Pessoa> listarPorNome(String nome) {
		Query query = this.getEntityManager().createQuery("from Pessoa p where p.nome like :nome");
		query.setParameter("nome", "%"+ nome + "%");
		query.setMaxResults(30);
		List<Pessoa> result = new ArrayList<>();
		for (Object o : query.getResultList()) {
			if (o instanceof Pessoa) {
				result.add((Pessoa)o);
			}
		}
		return result;
	}
	
	public Pessoa getPessoaByPkFetchTelefonesAndEnderecosAndPerfil(Long id){
		Query query = this.getEntityManager()
				.createQuery("select p from Pessoa p join fetch p.perfil left join fetch p.telefones left join fetch p.enderecos where p.id= :id");
		query.setParameter("id", id);
		return (Pessoa) query.getSingleResult();
	}
	@Override
	public Pessoa getPessoaByEmail(String email) {
		Pessoa pessoa = null;
		Query query = this.getEntityManager().createQuery("from Pessoa p where p.email = :email");
		query.setParameter("email", email);
		try {
			pessoa = (Pessoa)query.getSingleResult();
		} catch (NoResultException e) {// não encontrou nada na pesquisa
			return null;
		}
		return pessoa;
	}


	@Override
	public List<Pessoa> findPessoasInativas() {
		StringBuilder jpql = new StringBuilder();
		jpql.append(" from Pessoa ");
		jpql.append(" where ativo = false ");
		Query query = this.getEntityManager().createQuery(jpql.toString());
		List<Pessoa> result = new ArrayList<>();
		
		for (Object o : query.getResultList()) {
			if (o instanceof Pessoa) {
				result.add((Pessoa)o);
			}
		}
		return result;
	}
}
